/**
 * Copyright (C), 2012-2022，DapTech.
 *
 * @title GsonUtils.java
 * @package com.dt.serialize.gson
 * @Description
 * @author RID
 * @date Sun, 23 Jul 2017 23:30:15, GMT+8
 * @date 2017.07.23 23:30:15 GMT+8
 * @version v1.0
 * History:
 * 1. Date: 2017年7月23日 下午11:30:15
 * Author: RID
 * Modification: TODO
 * 2. ...
 */
package com.firmail.mock.util;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;

import java.io.IOException;
import java.io.StringReader;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

//import com.dt.serialize.bean.User;

/**
 * Gson完全可以将复杂类型的json到bean或bean到json的转换，是JSON解析的神器。Gson在功能上面无可挑剔，但是性能上面比FastJson有所差距。
 * @name GsonUtils
 * @description
 *              如果你主要是处理小文件请求，比如某个微服务或者分布式架构的初始化，那么GSON当是首选。
 * @author RID
 * @date Sun, 23 Jul 2017 23:30:15
 *
 */
public class GsonUtils {
    private static class SingleTonHoler {
        private static Gson INSTANCE = new Gson();
    }

    private static Gson gson = null;

    static {
        if (gson == null) {
            gson = new Gson();
        }
    }

    public static Gson getInstance() {
        return SingleTonHoler.INSTANCE;

    }

    private GsonUtils() {
    }

    public static String toJson(Object object) {
        return getInstance().toJson(object);
    }

    /**
     * 解析简单Json数据
     */
    public static <T> T parseJson(String jsonData, Class<T> entityType) {
        // Gson gson = new Gson();
        T t = gson.fromJson(jsonData, entityType);
        return t;
    }

    // 解析JsonArray数据
    public static <T> List<T> parseJsonArray(String jsonArrayData) {
        // Gson gson = new Gson();
        List<T> list = gson.fromJson(jsonArrayData, new TypeToken<List<T>>() {
        }.getType());
        return list;
    }

    /**
     * 转成list 解决泛型问题
     *
     * @param json
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> List<T> parseJsonArray(String json, Class<T> cls) {
        // Gson gson = new Gson();
        List<T> list = new ArrayList<T>();
        JsonArray array = new JsonParser().parse(json).getAsJsonArray();
        for (final JsonElement elem : array) {
            list.add(gson.fromJson(elem, cls));
        }
        return list;
    }

    /**
     * 转成list中有map的
     *
     * @param gsonString
     * @return
     */
    public static <K, T> List<Map<K, T>> parseJsonToListMaps(String gsonString) {
        List<Map<K, T>> list = null;
        if (gson != null) {
            list = gson.fromJson(gsonString, new TypeToken<List<Map<K, T>>>() {
            }.getType());
        }
        return list;
    }

    /**
     * 转成map的
     *
     * @param gsonString
     * @return
     */
    public static <K, T> Map<K, T> parseJsonToMaps(String gsonString) {
        Map<K, T> map = null;
        if (gson != null) {
            map = gson.fromJson(gsonString, new TypeToken<Map<K, T>>() {
            }.getType());
        }
        return map;
    }

/*
	public static void main(String[] args) {
		String json = "{\"name\":\"学学习\",\"age\":\"24\",\"emailAddress\":\"2457@123.com\"}";
		User user = (User) getObjectFromJson(User.class, json);
		System.out.println(user);
		user.setEmailAddress("57@123.com");
		System.out.println(toJson(user));
		List<Map<Integer, String>> list= new ArrayList<Map<Integer,String>>();
		Map<Integer,String> map= new LinkedHashMap<>();
		map.put(user.age, user.emailAddress);
		list.add(map);
		String json2= toJson(list);
		parseJsonToListMaps(json2).forEach(System.out::println);
	}
*/

    /**
     * json-->pojo
     *
     * @Description:序列化json
     * @param clazz
     * @param json
     * @return void 返回类型
     * @see #parseJson
     */
    //@SuppressWarnings("all")
    @Deprecated
    protected static Object getObjectFromJson(Class<?> clazz, String json) {
        JsonReader reader = new JsonReader(new StringReader(json));
        Field[] field = clazz.getDeclaredFields();
        Object obj = null;
        try {
            // 获取当前对象
            obj = clazz.newInstance();
            reader.beginObject();
            while (reader.hasNext()) {
                String name = reader.nextName();
                for (Field f : field) {
                    if (f.getName().equals(name)) {
                        if (f.getType() == int.class) {
                            f.setInt(obj, reader.nextInt());
                        } else if (f.getType() == Double.class) {
                            f.setDouble(obj, reader.nextDouble());
                        } else if (f.getType() == Long.class) {
                            f.setLong(obj, reader.nextLong());
                        } else if (f.getType() == Boolean.class) {
                            f.setBoolean(obj, reader.nextBoolean());
                        } else {
                            f.set(obj, reader.nextString());
                        }
                    }
                }
            }
            reader.endObject();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close();
            } catch (IOException e) {

                e.printStackTrace();
            }
        }
        return obj;
    }
}